# 中国工商银行账户管理系统
# 1.	编程实现：仔细业务之间的包含关系，并完成以下编程需求，要适当提高代码的可复用性。
#   a)	用户程序：账号（str：系统随机产生8位数字） 、姓名(str)、密码(int:6位数字)、地址、存款余额(int)、开户行（银行的名称（str））
#   b)	地址程序：国家(str)、省份(str)、街道(str)、门牌号(str)
#   c)	银行程序：能存储100用户的库(字典)、本银行名称（比如：中国工商银行的昌平支行,str）
#       i.	银行业务功能
#           1.	添加用户（传入参数：用户的所有信息。返回值：整型值（1：成功，2：用户已存在，3：用户库已满））
#               a)	业务逻辑：
#                   	先检查该用户的账号在库里是否存在。若不存在则在用户库里添加一个该用户并返回代号1
#                   	若存在则返回代号2。另外在添加用户的时候检测用户库是否已注册满，若已满则返回代号3
#           2.	存钱（传入值：用户的账号、存取的金额。返回值：布尔类型值）
#               a)	业务逻辑：
#                   	先根据传入的账号信息查询用户库里是否有该用户。若没有则返回False
#                   	若有，则将该用户的金额存进去。
#           3.	取钱（传入值：用户的账号，用户密码，取钱金额。返回值：整型值（0：正常，1：账号不存在，2：密码不对，3：钱不够））
#               a)	业务逻辑：
#                   	先根据账号信息来查询该用户是否存在，若不存在，则返回代号1，
#                   	若存在，则继续判断密码是否正确，若不正确，则返回代号2。
#                   	若账号密码都正确，则继续判断当前用户的金额是否满足要取出的钱，若不满足，则返回代号3，
#                   	若满足，则将该用户的金额减去。
#            4.	转账（传入值：转出的账号，转入的账号，转出账号的密码，转出的金额。返回值：0：正常，1：账号不对，2密码不对，3钱不够）
#                a)	业务逻辑：
#                   	先查询用户库是否存在转出和转入的账号，若不存在则返回代号,1，
#                   	若账号都存在则继续判断转出账号的密码是否正确，若不正确，则返回2，
#                   	若正确则继续判断要转出的金额是否足够，若不够则返回3，
#                   	否则正常转出，转出的账号用户金额要相对应的减少，转入的金额相对应的增加。
#            5.	查询账户功能（传入值：账号，账号密码，返回值：空）
#               a)	业务逻辑：
#                   	先根据账号判断用户库是否存在该用户，若不存在则打印提示信息：该用户不存在。
#                   	否则继续判断密码是否正确。若不正确则打印相对应的错误信息。
#                   	若账号和密码都正确，则将该用户的信息都打印出来
#                       比如：当前账号：xxxx,密码:xxxxxx,余额：xxxx元，用户居住地址：xxxxxxxxxxxxx，当前账户的开户行：xxxxxxxxxx.

import random

# 生成随机8位数字账号
def generate_account():
    return str(random.randint(10000000, 99999999))

# 初始化银行信息
def init_bank(name):
    return {
        'name': name,
        'users': {}
    }

# 添加用户
def add_user(bank, name, password, address, balance, bank_name):
    if len(bank['users']) >= 100:
        return 3  # 用户库已满
    account = generate_account()
    if account in bank['users']:
        return 2  # 用户已存在
    bank['users'][account] = {
        'account': account,
        'name': name,
        'password': password,
        'address': address,
        'balance': balance,
        'bank_name': bank_name
    }
    return account, 1  # 返回生成的账号和成功标志

# 存钱
def deposit(bank, account, amount):
    if account not in bank['users']:
        return False
    bank['users'][account]['balance'] += amount
    return True

# 取钱
def withdraw(bank, account, password, amount):
    if account not in bank['users']:
        return 1  # 账号不存在
    user = bank['users'][account]
    if user['password'] != password:
        return 2  # 密码不对
    if user['balance'] < amount:
        return 3  # 钱不够
    user['balance'] -= amount
    return 0  # 正常

# 转账
def transfer(bank, from_account, to_account, password, amount):
    if from_account not in bank['users'] or to_account not in bank['users']:
        return 1  # 账号不对
    from_user = bank['users'][from_account]
    to_user = bank['users'][to_account]
    if from_user['password'] != password:
        return 2  # 密码不对
    if from_user['balance'] < amount:
        return 3  # 钱不够
    from_user['balance'] -= amount
    to_user['balance'] += amount
    return 0  # 正常

# 查询账户
def query(bank, account, password):
    if account not in bank['users']:
        print("该用户不存在。")
        return
    user = bank['users'][account]
    if user['password'] != password:
        print("密码不对。")
        return
    print(f"当前账号：{user['account']}, 密码: {user['password']}, 余额：{user['balance']}元, "
          f"用户居住地址：{user['address']}, 当前账户的开户行：{user['bank_name']}")

# 处理用户选择
def handle_choice(user_choice, bank):
    if user_choice == "1":
        name = input("请输入姓名：")
        password = int(input("请输入6位数字密码："))
        if password < 100000 or password > 999999:
            print("密码必须是6位数字。")
            return
        country = input("请输入国家：")
        province = input("请输入省份：")
        street = input("请输入街道：")
        door_number = input("请输入门牌号：")
        balance = int(input("请输入初始存款余额："))
        address = f"{country}, {province}, {street}, {door_number}"
        account, result = add_user(bank, name, password, address, balance, bank['name'])
        if result == 1:
            print(f"开户成功，你的账号是：{account}")
        elif result == 2:
            print("用户已存在。")
        elif result == 3:
            print("用户库已满。")
    elif user_choice == "2":
        account = input("请输入账号：")
        amount = int(input("请输入存取的金额："))
        if deposit(bank, account, amount):
            print("存钱成功。")
        else:
            print("账号不存在。")
    elif user_choice == "3":
        account = input("请输入账号：")
        password = int(input("请输入密码："))
        amount = int(input("请输入取钱金额："))
        result = withdraw(bank, account, password, amount)
        if result == 0:
            print("取钱成功。")
        elif result == 1:
            print("账号不存在。")
        elif result == 2:
            print("密码不对。")
        elif result == 3:
            print("钱不够。")
    elif user_choice == "4":
        from_account = input("请输入转出的账号：")
        to_account = input("请输入转入的账号：")
        password = int(input("请输入转出账号的密码："))
        amount = int(input("请输入转出的金额："))
        result = transfer(bank, from_account, to_account, password, amount)
        if result == 0:
            print("转账成功。")
        elif result == 1:
            print("账号不对。")
        elif result == 2:
            print("密码不对。")
        elif result == 3:
            print("钱不够。")
    elif user_choice == "5":
        account = input("请输入账号：")
        password = int(input("请输入密码："))
        query(bank, account, password)
    elif user_choice == "6":
        print("Bye")
        exit()

# 系统界面
def menu(bank):
    print("*" * 30)
    print("*中国工商银行*")
    print("*账户管理系统*")
    print("1.开户")
    print("2.存钱")
    print("3.取钱")
    print("4.转账")
    print("5.查询")
    print("6.Bye")
    print("请选择：")
    while True:
        user_choice = input("请输入你的选择：")
        if user_choice in ["1", "2", "3", "4", "5", "6"]:
            handle_choice(user_choice, bank)
        else:
            print("请输入正确的选项")

# 主函数
def main():
    bank = init_bank("中国工商银行")
    menu(bank)

if __name__ == '__main__':
    main()
